﻿using System.Collections.Generic;
using System.Web;
using Wedn.Core.Entity;
using Wedn.Core.Utility;

namespace Wedn.Core.Service
{
    /// <summary>
    /// 选项管理类
    /// </summary>
    public class OptionManager
    {
        private Wedn.Interface.DAL.IOption dao;

        /// <summary>
        /// 选项管理类构造函数
        /// </summary>
        /// <exception cref="未找到系统数据库访问组件"></exception>
        public OptionManager()
        {
            dao = Wedn.Interface.DAOFactory.CreateOptionDAOInstance();
            if (dao == null)
            {
                throw new System.Exception("缺失数据库访问组件!");
            }
        }

        ///// <summary>
        ///// lock
        ///// </summary>
        //private object lockHelper = new object();
        ///// <summary>
        ///// 初始化
        ///// </summary>
        //public void LoadSetting()
        //{
        //    if (Settings == null)
        //    {
        //        lock (lockHelper)
        //        {
        //            if (Settings == null)
        //            {
        //                Settings = dao.SelectKeyValue(null);
        //            }
        //        }
        //    }
        //}

        /// <summary>
        /// 向选项设置表中插入一行数据, 返回执行结果受影响行数
        /// </summary>
        /// <param name="option">要插入的选项对象</param>
        /// <returns>执行结果受影响行数</returns>
        public int Insert(Option option)
        {
            CacheHelper.Remove("Setting");
            return dao.Insert(option);
        }

        /// <summary>
        /// 根据选项ID删除对应的一条选项记录, 返回执行结果受影响行数
        /// </summary>
        /// <param name="id">要删除的选项ID</param>
        /// <returns>执行结果受影响行数</returns>
        public int Delete(int id)
        {
            CacheHelper.Remove("Setting");
            return dao.Delete(id);
        }

        /// <summary>
        /// 根据选项ID数组删除对应的多条选项记录, 返回执行结果受影响行数
        /// </summary>
        /// <param name="ids">要删除的选项ID数组</param>
        /// <returns>执行结果受影响行数</returns>
        public int Delete(int[] ids)
        {
            CacheHelper.Remove("Setting");
            return dao.Delete(ids);
        }

        /// <summary>
        /// 根据选项名称更新对应的选项值, 返回执行结果受影响行数
        /// </summary>
        /// <param name="name">要修改的选项名称</param>
        /// <param name="value">要更新的值</param>
        /// <returns>执行结果受影响行数</returns>
        public int UpdateValue(string name, string value)
        {
            CacheHelper.Remove("Setting");
            return dao.UpdateValue(name, value);
        }

        /// <summary>
        /// 更新一个完整选项对象, 返回执行结果受影响行数
        /// </summary>
        /// <param name="option">要更新的对象</param>
        /// <returns>执行结果受影响行数</returns>
        public int UpdateOption(Option option)
        {
            CacheHelper.Remove("Setting");
            return dao.UpdateOption(option);
        }

        /// <summary>
        /// 获取表中主键最大值, 返回主键最大值
        /// </summary>
        /// <returns>主键最大值</returns>
        public int GetMaxId()
        {
            return dao.SelectMaxId();
        }

        /// <summary>
        /// 检查表中是否已经存在该选项名称, 返回一个布尔值, 存在则为True; 不存在则为False
        /// </summary>
        /// <param name="name">要确定的选项名称</param>
        /// <returns>存在返回True; 不存在返回False</returns>
        public bool ExistsKey(string name)
        {
            return dao.ExistsKey(name);
        }

        /// <summary>
        /// 取出选项表中所有选项设置信息, 返回选项对象集合, 如果不存在则返回空集合
        /// </summary>
        /// <returns>所有选项对象集合</returns>
        public List<Option> GetOptionList()
        {
            List<Option> list = dao.SelectOptionList();
            if (list == null)
                list = new List<Option>();
            return list;
        }

        /// <summary>
        /// 根据选项名称选取选项表中对应的选项值, 返回对应选项值, 如果不存在则返回null
        /// </summary>
        /// <param name="name">选项名称</param>
        /// <returns>对应的选项值</returns>s
        public string GetValue(string name)
        {
            return dao.SelectValue(name);
        }

        /// <summary>
        /// 根据选项名称选取选项表中对应的选项值, 返回对应选项值, 如果不存在则返回null
        /// </summary>
        /// <param name="name">选项名称</param>
        /// <returns>对应的选项值</returns>s
        public string GetSetting(string name)
        {
            return dao.SelectValue(name);
        }

        /// <summary>
        /// 根据选项名称选取选项表中对应的选项值, 返回对应选项值, 如果不存在则返回空数组
        /// </summary>
        /// <param name="names">选项名称数组</param>
        /// <returns>对应的选项值数组</returns>
        public string[] GetValue(string[] names)
        {
            string[] strs = dao.SelectValue(names);
            if (strs == null)
                strs = new string[0];
            return strs;
        }

        /// <summary>
        /// 根据选项名称选取选项表中对应的选项值, 返回对应选项值, 如果不存在则返回空数组
        /// </summary>
        /// <param name="names">选项名称数组</param>
        /// <returns>对应的选项值数组</returns>
        public string[] GetSetting(string[] names)
        {
            string[] strs = dao.SelectValue(names);
            if (strs == null)
                strs = new string[0];
            return strs;
        }

        /// <summary>
        /// 根据选项名称选取选项表中对应的选项值, 返回对应选项键值对, 如果不存在则返回空字典
        /// </summary>
        /// <param name="names">选项名称数组(选取全部则传入null)</param>
        /// <returns>对应的选项值数组</returns>
        public Dictionary<string, object> GetDict(string[] names)
        {
            Dictionary<string, object> dict = dao.SelectKeyValueDict(names);
            if (dict == null)
                dict = new Dictionary<string, object>();
            return dict;
        }
        /// <summary>
        /// 根据选项ID选取对应的选项对象, 返回一个选项对象, 不存在则返回null
        /// </summary>
        /// <param name="id">选项ID</param>
        /// <returns>指定ID的选项对象</returns>s
        public Option GetOption(int id)
        {
            return dao.SelectOption(id);
        }
    }
}
